package models

// "github.com/vinllen/mgo"

// // "server/app"
// "server/library/mongo"
// "server/library/utils"

type Code struct {
	ID         string `form:"-" json:"id" bson:"_id,omitempty"`            // 仓库的唯一ID
	Name       string `form:"name" json:"name" bson:"name"`                // 仓库的名字
	Addr       string `form:"addr" json:"addr" bson:"addr"`                // 仓库地址
	Type       string `form:"type" json:"type" bson:"type"`                // 仓库类型
	Job        string `form:"-" json:"job" bson:"job"`                     // job
	Image      string `form:"image" json:"image" bson:"image"`             // Image
	Host       string `form:"host" json:"host" bson:"host"`                // 打包机
	HostIP     string `form:"host_ip" json:"host_ip" bson:"host_ip"`       // 打包机
	Script     string `form:"script" json:"script" bson:"script"`          // 打包执行的脚本
	CodeEnable bool   `form:"-" json:"code_enable"`                        // 代码是否可用（clone成功）
	IsRemote   bool   `form:"is_remote" json:"is_remote" bson:"is_remote"` // 仓库地址是否远程地址
}

// func TrimSpace(str string, format string, replace string) []string {
// 	tmp := strings.Split(str, "\n")
// 	length := len(tmp)
// 	ret := make([]string, length)
// 	for i, v := range tmp {
// 		if len(v) > 0 {
// 			ret[i] = strings.TrimSpace(strings.Replace(v, format, replace, 1))
// 		} else {
// 			length -= 1
// 		}
// 	}
// 	return ret[:length]
// }

// func TrimSVN(str string) []string {
// 	tmp := strings.Split(str, "\n")
// 	length := len(tmp)
// 	ret := make([]string, length)
// 	idx := 0
// 	for _, v := range tmp {
// 		if len(v) > 0 && v[0] == 'r' {
// 			ret[idx] = v[1:(strings.Index(v, "|") - 1)]
// 			idx = idx + 1
// 		} else {
// 			length -= 1
// 		}
// 	}

// 	return ret[:idx]
// }

// func (this *Code) CodePath() string {
// 	// if this.IsRemote {
// 	//     return path.Join(app.Instance.Settings.CodeDir, this.ID.Hex())
// 	// } else {
// 	//     return this.Addr
// 	// }
// 	return ""
// }

// func (this *Code) PackagePath() string {
// 	// return path.Join(app.Instance.Settings.PackageDir, this.ID.Hex())
// 	return ""
// }

// func (this *Code) CloneCode(job *Job) error {
// 	agent := GeneralSSH(this.Host)
// 	if agent == nil {
// 		return errors.New("主机配置失败")
// 	}
// 	go func() {
// 		defer func() {
// 			this.Job = ""
// 			this.CodeEnable = true
// 			CodeUpdate(this)
// 		}()
// 		job.UpdateProgress(10)
// 		job.UpdateDetail("clone beginning!")
// 		code_path := this.CodePath()
// 		command := fmt.Sprintf("rm -fr %s; mkdir -p %s; git clone %s %s", code_path, code_path, this.Addr, code_path)
// 		err := agent.RunJob(job, command)
// 		if err != nil {
// 			job.Stop(JOB_STATUS_FAILED, "")
// 			return
// 		}
// 		job.UpdateDetail("clone success!")
// 		job.Stop(JOB_STATUS_SUCCESS, "success")
// 	}()
// 	return nil
// }

// func (this *Code) RemoveCode() error {
// 	agent := GeneralSSH(this.Host)
// 	if agent == nil {
// 		return errors.New("主机配置失败")
// 	}
// 	code_path := this.CodePath()
// 	_, err := agent.Run(fmt.Sprintf("rm -fr %s", code_path), 10)
// 	return err
// }

// func (this *Code) Branches() ([]string, error) {
// 	agent := GeneralSSH(this.Host)
// 	if agent == nil {
// 		return nil, errors.New("主机配置失败")
// 	}
// 	code_path := this.CodePath()
// 	if this.Type == "svn" {
// 		ret, err := agent.Run(fmt.Sprintf("cd %s && url=`svn info --show-item url` && svn log $url -l 15 -q", code_path), 5)
// 		if err != nil {
// 			return nil, err
// 		}
// 		branches := TrimSVN(ret)
// 		return branches, nil
// 	}
// 	ret, err := agent.Run(fmt.Sprintf("cd %s && git fetch -p && git branch -r", code_path), 5)
// 	if err != nil {
// 		return nil, err
// 	}
// 	branches := TrimSpace(ret, "origin/", "")
// 	return branches, nil
// }

// func (this *Code) MakeCode(job *Job, branch string) error {
// 	agent := GeneralSSH(this.Host)
// 	if agent == nil {
// 		return errors.New("主机配置失败")
// 	}
// 	go func() {
// 		defer func() {
// 			this.Job = ""
// 			CodeUpdate(this)
// 		}()
// 		job.UpdateProgress(10)
// 		code_path := this.CodePath()
// 		fileName := fmt.Sprintf("%s_%s_%s.tar.gz", this.Name, branch, time.Now().Format("20060102150405"))
// 		command := fmt.Sprintf("export BUILD_DIR=%s;export BRANCH=%s;export BUILD_URL=%s;export BUILD_NAME=%s;%s", code_path, branch, this.Addr, fileName, this.Script)
// 		err := agent.RunJob(job, command)
// 		if err != nil {
// 			job.Stop(JOB_STATUS_FAILED, "")
// 			return
// 		}
// 		job.UpdateProgress(70)
// 		pack_path := this.PackagePath()
// 		err = utils.Mkdir(pack_path)
// 		if err != nil {
// 			job.Stop(JOB_STATUS_FAILED, fmt.Sprintf("mkdir %s failed: %s", pack_path, err.Error()))
// 			return
// 		}
// 		gzName := path.Join(code_path, fileName)
// 		packName := path.Join(pack_path, fileName)
// 		err = agent.Download(gzName, packName)
// 		if err != nil {
// 			job.Stop(JOB_STATUS_FAILED, fmt.Sprintf("download target %s failed: %s", gzName, err.Error()))
// 			return
// 		}
// 		job.UpdateProgress(90)
// 		commit, err := "", nil
// 		if this.Type == "git" {
// 			commit, err = agent.Run(fmt.Sprintf("cd %s && git log -1", code_path), 30)
// 			if err != nil {
// 				job.Stop(JOB_STATUS_FAILED, commit)
// 				return
// 			}
// 		} else {
// 			commit, err = agent.Run(fmt.Sprintf("cd %s && svn log -l 1", this.Addr), 30)
// 			if err != nil {
// 				job.Stop(JOB_STATUS_FAILED, commit)
// 				return
// 			}
// 		}
// 		size, err := utils.GetFileSize(packName)
// 		if err != nil {
// 			job.Stop(JOB_STATUS_FAILED, fmt.Sprintf("download target %s failed: %s", gzName, err.Error()))
// 			return
// 		}
// 		job.UpdateProgress(99)
// 		job.Stop(JOB_STATUS_SUCCESS, "success")
// 		pack := Package{
// 			ID:       bson.NewObjectId(),
// 			Name:     fileName,
// 			Code:     this.Name,
// 			CodeId:   this.ID.Hex(),
// 			Branch:   branch,
// 			Commit:   commit,
// 			Image:    this.Image,
// 			PackTime: time.Now().Unix(),
// 			CostTime: job.EndTime - job.StartTime,
// 			Log:      job.Detail,
// 			Size:     size,
// 		}
// 		PackageInsert(&pack)
// 	}()
// 	return nil
// }

// // 数据库操作
// const CODE_COLLECTION_NAME = "codes"

// func GetCodeCollection() *mgo.Collection {
// 	return mongo.GetCollection(CODE_COLLECTION_NAME)
// }

// func CodeHasName(name string) bool {
// 	var code Code
// 	err := GetCodeCollection().Find(bson.M{"name": name}).One(&code)
// 	return err == nil
// }

// func CodeInsert(record *Code) error {
// 	return GetCodeCollection().Insert(record)
// }

// func CodeUpdate(record *Code) error {
// 	return GetCodeCollection().UpdateId(record.ID, record)
// }

// func CodeDel(id string) error {
// 	return GetCodeCollection().RemoveId(bson.ObjectIdHex(id))
// }

// func CodeGet(id string) *Code {
// 	var code Code
// 	err := GetCodeCollection().FindId(bson.ObjectIdHex(id)).One(&code)
// 	if err != nil {
// 		return nil
// 	}
// 	return &code
// }

// func CodeAll() *[]*Code {
// 	codes := make([]*Code, 0)
// 	GetCodeCollection().Find(nil).All(&codes)
// 	return &codes
// }
